home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / vectobj / animeditor.bak / animeditor.amosSourceCode next >
AMOS Source Code  |  1997-01-31  |  54KB  |  1,864 lines

  1. Set Buffer 500
  2. While Screen<>-1 : Screen Close Screen : Wend 
  3. Degree 
  4. Screen Open 0,320,256,8,Lowres : Curs Off : Flash Off : Cls 0
  5. Palette 0,0,$F00,$F0,$222,$651,$F33 : Paper 0 : Pen 1
  6. Wait Vbl 
  7. Locate 0,13 : Centre "Animation Editor Version 1.2"
  8. Locate 0,15 : Centre "� Short But Purple Software"
  9. Locate 0,17 : Centre "By Charles Blessing 1995"
  10. Wait Vbl 
  11. Fade 1,0,$FFF
  12. Wait 100
  13. Fade 1
  14. Wait 25
  15. Cls 0
  16. For C=9 To 31
  17.    Colour C,$DD
  18. Next 
  19. Change Mouse 2
  20. Double Buffer : Autoback 0
  21. Wait Vbl 
  22. Limit Mouse 
  23.  
  24. Screen Open 2,320,256,4,Lowres
  25. Screen Hide 2
  26. 'Load Iff "work:graphics/numbers.iff"
  27. 'For N=0 To 9
  28. '   Get Bob N+1,N*4,0 To N*4+4,6 
  29. 'Next  
  30. 'Get Bob 14,0,30 To 41,35
  31. 'Get Bob 15,0,36 To 49,41
  32. 'Get Bob 16,0,42 To 39,47
  33. 'Get Bob 19,0,48 To 27,53
  34. _MOVEOBJ=0
  35. _ROTOBJ=1
  36. _CONNECT=2
  37. Global _MOVEOBJ,_ROTOBJ,_MODE,_SELOBJ,_SIZE
  38. Global XRET,YRET,ZRET,XO,YO,ZO,SCALE#,_NOBJ,_MAXNOBJ,_MAXPTS,_MAXPGNS
  39. Global _MAXNOS,_MAXTEXTURES,_NPTS,_XROT,_YROT,_CXP,_CYP,_MAXFRAMES,_FRAME
  40. Global _NOFRAMES,_CONNECT,_MAXNOSUBOBJ,_PROJ$
  41. XO=-80 : YO=-64 : ZO=-64 : SCALE#=1 : _NOBJ=0 : _XROT=0 : _YROT=0
  42. _MAXNOBJ=30 : _MAXPTS=_MAXNOBJ*50 : _MAXPGNS=50 : _MAXNOS=16
  43. _MAXTEXTURES=50 : _NPTS=0 : _MAXFRAMES=100 : _FRAME=0 : _SELOBJ=-1
  44. _NOFRAMES=1 : _ROTATED=False : _MAXNOSUBOBJ=10 : _SIZE=100
  45. Dim _PT(_MAXPTS,2),_PGN(_MAXNOBJ,_MAXPGNS,_MAXNOS)
  46. Dim _NOS(_MAXNOBJ,_MAXPGNS),_TEX$(_MAXTEXTURES)
  47. Dim _POLYTEX(_MAXNOBJ,_MAXPGNS),_TEXPOS(_MAXNOBJ,_MAXPGNS,_MAXNOS,1)
  48. Dim _NOP(_MAXNOBJ),_PTASSOC(_MAXPTS)
  49. Dim _ORDER(_MAXNOBJ),_DIST(_MAXNOBJ)
  50. Dim _XP(_MAXPTS),_YP(_MAXPTS),_RPT(_MAXPTS,2)
  51. Dim _ANG(_MAXFRAMES,_MAXNOBJ,2),_POS(_MAXFRAMES,_MAXNOBJ,2)
  52. Dim _MIDPT(_MAXNOBJ),_FILE$(_MAXNOBJ)
  53. Dim _SIN(359),_COS(359),_PVRPT(_MAXPTS,2)
  54. Dim _NOSUBOBJ(_MAXNOBJ),_SUBOBJ(_MAXNOBJ,_MAXNOSUBOBJ,1),_IMASUB(_MAXNOBJ)
  55. Global _PT(),_PGN(),_NOS(),_TEX$(),_POLYTEX(),_TEXPOS(),_NOP(),_XP()
  56. Global _YP(),_RPT(),_ANG(),_POS(),_PTASSOC(),_DIST(),_ORDER(),_MIDPT()
  57. Global _SIN(),_COS(),_FILE$(),_ROTATED,_PVRPT(),_NOSUBOBJ()
  58. Global _SUBOBJ(),_IMASUB()
  59. For A=0 To 359
  60.    _SIN(A)=32768*Sin(A)
  61.    _COS(A)=32768*Cos(A)
  62. Next 
  63. Screen 0
  64. Reserve Zone 4
  65. Set Zone 1,0,0 To 160,128
  66. Set Zone 2,0,128 To 160,256
  67. Set Zone 3,160,128 To 320,256
  68. Set Zone 4,160,0 To 320,128
  69.  
  70. _MAKESCREEN
  71. _CHANGEMODE[_MOVEOBJ]
  72. _REDRAW
  73. Screen 0
  74. _CXP=X Hard(303) : _CYP=Y Hard(110)
  75. Fade 1,0,$FFF,$F00,$F0,$222,$651,$F33
  76. _MAKEFRAME
  77. Repeat 
  78.    I$=Upper$(Inkey$)
  79.    Clear Key 
  80.    If I$="L" : _LOADOBJ[""] : _REDRAW
  81.    Else If I$="S" : _SAVEPROJ
  82.    Else If I$="O" : _OPENPROJ[""]
  83.    Else If I$="M" : _CHANGEMODE[_MOVEOBJ]
  84.    Else If I$="R" : _CHANGEMODE[_ROTOBJ]
  85.    Else If I$=Chr$(28) : _MOVEAXISLEFT
  86.    Else If I$=Chr$(29) : _MOVEAXISRIGHT
  87.    Else If I$=Chr$(30) : _MOVEAXISUP
  88.    Else If I$=Chr$(31) : _MOVEAXISDOWN
  89.    Else If I$="=" : _ZOOMIN : _REDRAW
  90.    Else If I$="-" : _ZOOMOUT : _REDRAW
  91.    Else If I$="N" : _NEXTOBJ
  92.    Else If I$="P" : _PREVIOUSOBJ
  93.    Else If I$="." : _NEXTFRAME
  94.    Else If I$="," : _PREVFRAME
  95.    Else If I$="T" : _TWEEN
  96.    Else If I$="F" : _SETNOFRAMES
  97.    Else If I$="G" : _GOTOFRAME
  98.    Else If I$="A" : _ANIMATE
  99.    Else If I$="C" : _CHANGEMODE[_CONNECT]
  100.    Else If I$="D" : _DISCONNECT
  101.    Else If I$="U" : _UPDATE
  102.    Else If I$="K" : _COPY
  103.    Else If I$="W" : _WRITEINCBIN
  104.    Else If I$="Z" : _CHANGESIZE
  105.    Else If I$="Q" : _POINTREMOVAL
  106.    End If 
  107.    _MAKECOORDS
  108.    Wait Vbl 
  109.    Sprite Off 10
  110.    Sprite Off 11
  111.    Sprite Off 12
  112.    If Mouse Zone<4
  113.       Sprite 10,_CXP,_CYP,11
  114.       Sprite 11,_CXP,_CYP+6,12
  115.       Sprite 12,_CXP,_CYP+12,13
  116.    Else 
  117.       Screen 2
  118.       _MAKESTRING[_XROT] : _MAKENUM[Param$] : Get Bob 11,0,0 To 16,6
  119.       _MAKESTRING[_YROT] : _MAKENUM[Param$] : Get Bob 12,0,0 To 16,6
  120.       Screen 0
  121.       Sprite 10,_CXP,_CYP+6,11
  122.       Sprite 11,_CXP,_CYP+12,12
  123.    End If 
  124.    If Mouse Key=1
  125.       If Mouse Zone=4
  126.          If _MODE=_CONNECT
  127.             If _IMASUB(_SELOBJ)
  128.                Bell 20 : Wait 5 : Play Off 
  129.             Else 
  130.                _MAKESUB
  131.             End If 
  132.          Else 
  133.             _ROTPERSPVIEW
  134.          End If 
  135.          _REDRAW
  136.       Else 
  137.          If _MODE=_MOVEOBJ
  138.             _MOVE
  139.          Else If _MODE=_ROTOBJ
  140.             _ROTATE
  141.          Else If _MODE=_CONNECT
  142.             If _IMASUB(_SELOBJ)
  143.                Bell 20 : Wait 5 : Play Off 
  144.             Else 
  145.                _MAKESUB
  146.             End If 
  147.          End If 
  148.       End If 
  149.    Else If Mouse Key=2
  150.       If Mouse Zone=4
  151.          If _MODE=_CONNECT
  152.             _ROTPOINTVIEW
  153.          Else 
  154.             _ROTPERSPVIEW
  155.          End If 
  156.       Else 
  157.          If _MODE=_CONNECT
  158.             _SELECTOBJECT : _TS=Param
  159.             If _TS>=0
  160.                If _IMASUB(_TS)
  161.                   Bell 20 : Wait 5 : Play Off 
  162.                Else 
  163.                   _SELOBJ=Param
  164.                   _REDRAW
  165.                End If 
  166.             End If 
  167.          Else 
  168.             _SELECTOBJECT : _SELOBJ=Param : _REDRAW
  169.          End If 
  170.       End If 
  171.    End If 
  172. Until I$=Chr$(27)
  173.  
  174. Sprite Off 
  175. Wait Vbl 
  176. Screen 0
  177. Fade 1
  178. Wait 25
  179. While Screen<>-1 : Screen Close Screen : Wend 
  180. Edit 
  181.  
  182. Procedure _MAKESCREEN
  183.    Screen Open 1,320,256,8,Lowres : Curs Off : Flash Off : Cls 0
  184.    Palette 0,0,0,0,0,0,0,0
  185.    Screen To Back 1
  186.    Ink 4
  187.    For X=0 To 320 Step 4
  188.       Draw X,0 To X,256
  189.    Next 
  190.    For Y=0 To 256 Step 4
  191.       Draw 0,Y To 640,Y
  192.    Next 
  193.    Cls 0,160,0 To 320,128
  194.    Ink 2
  195.    Box 0,0 To 319,255
  196.    Draw 160,0 To 160,256
  197.    Draw 0,128 To 320,128
  198.    Screen 0
  199.    _CLEARSCREEN
  200. End Proc
  201. Procedure _CLEARSCREEN
  202.    Screen Copy 1 To 0
  203.    X=XO*SCALE#
  204.    Y=YO*SCALE#
  205.    Z=ZO*SCALE#
  206.    Ink 5 : _SCRCLIP[1] : Draw -X,0 To -X,128 : Draw 0,128+Z To 160,128+Z
  207.    _SCRCLIP[2] : Draw -X,128 To -X,255 : Draw 0,256+Y To 160,256+Y
  208.    _SCRCLIP[3] : Draw 160-Z,128 To 160-Z,256 : Draw 160,256+Y To 320,256+Y
  209.    _SCRCLIP[0]
  210. '   Screen Swap  
  211. '   Wait Vbl 
  212. '   Screen Copy 1 To 0 
  213. '   Ink 5 : _SCRCLIP[1] : Draw -X,0 To -X,128 : Draw 0,128+Y To 160,128+Y
  214. '   _SCRCLIP[2] : Draw -X,128 To -X,255 : Draw 0,256+Z To 160,256+Z
  215. '   _SCRCLIP[3] : Draw 160-Y,128 To 160-Y,256 : Draw 160,256+Z To 320,256+Z
  216. '   _SCRCLIP[0]
  217. End Proc
  218. Procedure _REDRAW
  219.    _CLEARSCREEN
  220.    _ROTPOINTS[-1]
  221.    If _NOBJ>0
  222. '      For N=0 To _NOBJ-1
  223. '         If _NOSUBOBJ(N)>0
  224. '            For S=0 To _NOSUBOBJ(N)-1 
  225. '               P=_SUBOBJ(N,S,1) 
  226. '               O=_SUBOBJ(N,S,0) 
  227. '               X1=_RPT(P,0) 
  228. '               Y1=_RPT(P,1) 
  229. '               Z1=_RPT(P,2) 
  230. '               X1=_POS(_FRAME,O,0)
  231. '               Y1=_POS(_FRAME,O,1)
  232. '               Z1=_POS(_FRAME,O,2)
  233. '               _JOIN[X1,Y1,Z1,X2,Y2,Z2,6] 
  234. '            Next  
  235. '         End If 
  236. '      Next  
  237.       For N=0 To _NOBJ-1
  238.          If N<>_SELOBJ
  239.             _HIGHOBJ[N,1]
  240.          End If 
  241.       Next 
  242.       If _SELOBJ>=0
  243.          _HIGHOBJ[_SELOBJ,3]
  244.       End If 
  245.    End If 
  246.    Screen Swap 
  247.    Wait Vbl 
  248. End Proc
  249. Procedure _CHANGEMODE[M]
  250.    _MODE=M
  251.    If M=_MOVEOBJ
  252.       Sprite 9,X Hard(162),Y Hard(122),14
  253.    Else If M=_ROTOBJ
  254.       Sprite 9,X Hard(162),Y Hard(122),15
  255.    Else If M=_CONNECT
  256.       Sprite 9,X Hard(162),Y Hard(122),19
  257.    Else If M=_SELCHILD
  258.       Sprite 9,X Hard(162),Y Hard(122),20
  259.    End If 
  260. End Proc
  261. Procedure _LOADOBJ[T$]
  262.    If T$=""
  263.       SCR=Screen
  264.       Screen Open 3,640,64,2,Hires
  265.       Flash Off : Cls 0 : Palette $8,$FF0
  266.       Locate 1,1 : Print "LOAD OBJECT"
  267.       Locate 1,3 : Print "Please enter the filename of an object previously designed"
  268.       Locate 1,4 : Input "using the object editor : ";F$
  269.       Curs Off 
  270.    Else 
  271.       F$=T$
  272.    End If 
  273.    If Exist(F$)
  274.       Open In 1,F$
  275.       Reserve As Work 10,Lof(1)
  276.       Close 1
  277.       Bload F$,10
  278.       A=Start(10)
  279.       _NUMPOINTS=Deek(A) : Add A,2
  280.       _FIRSTPOINT=_NPTS
  281.       For N=0 To _NUMPOINTS
  282.          _MYDEEK[A] : _PT(_NPTS,0)=(Param*_SIZE)/100 : Add A,2
  283.          _MYDEEK[A] : _PT(_NPTS,1)=(-Param*_SIZE)/100 : Add A,2
  284.          _MYDEEK[A] : _PT(_NPTS,2)=(Param*_SIZE)/100 : Add A,2
  285.          _PTASSOC(_NPTS)=_NOBJ
  286.          Inc _NPTS
  287.       Next 
  288.       _NOP(_NOBJ)=Deek(A) : Add A,2
  289.       If _NOP(_NOBJ)>0
  290.          For P=0 To _NOP(_NOBJ)-1
  291.             _NOS(_NOBJ,P)=Deek(A)
  292.             Add A,4
  293.             For N=0 To _NOS(_NOBJ,P)+1
  294.                _PGN(_NOBJ,P,N)=Deek(A)+_FIRSTPOINT : Add A,2
  295.                _TEXPOS(_NOBJ,P,N,0)=Peek(A) : Add A,1
  296.                _TEXPOS(_NOBJ,P,N,1)=Peek(A) : Add A,1
  297.             Next 
  298.             _MYDEEK[A] : _POLYTEX(_NOBJ,P)=Param : Add A,2
  299.             'note that this ^ is not a simple number!  
  300.             Add A,4
  301.          Next 
  302.          If T$=""
  303.             For F=0 To _MAXFRAMES
  304.                _ANG(F,_NOBJ,0)=0 : _ANG(F,_NOBJ,1)=0 : _ANG(F,_NOBJ,2)=0
  305.                _POS(F,_NOBJ,0)=0 : _POS(F,_NOBJ,1)=0 : _POS(F,_NOBJ,2)=0
  306.             Next 
  307.          End If 
  308.          _PT(_NPTS,0)=0 : _PT(_NPTS,1)=0 : _PT(_NPTS,2)=0
  309.          _PTASSOC(_NPTS)=_NOBJ
  310.          For P=0 To _NOP(_NOBJ)-1
  311.             X=0 : Y=0 : Z=0
  312.             For N=0 To _NOS(_NOBJ,P)
  313.                PT=_PGN(_NOBJ,P,N)
  314.                X=X+_PT(PT,0)
  315.                Y=Y+_PT(PT,1)
  316.                Z=Z+_PT(PT,2)
  317.             Next 
  318.             _PT(_NPTS,0)=_PT(_NPTS,0)+(X/(_NOS(_NOBJ,P)+1))
  319.             _PT(_NPTS,1)=_PT(_NPTS,1)+(Y/(_NOS(_NOBJ,P)+1))
  320.             _PT(_NPTS,2)=_PT(_NPTS,2)+(Z/(_NOS(_NOBJ,P)+1))
  321.          Next 
  322.          _PT(_NPTS,0)=_PT(_NPTS,0)/_NOP(_NOBJ)
  323.          _PT(_NPTS,1)=_PT(_NPTS,1)/_NOP(_NOBJ)
  324.          _PT(_NPTS,2)=_PT(_NPTS,2)/_NOP(_NOBJ)
  325.          _MIDPT(_NOBJ)=_NPTS
  326.          _FILE$(_NOBJ)=F$
  327.          Inc _NPTS
  328.          Inc _NOBJ
  329.       Else 
  330.          Locate 1,6 : Print "Object has no faces"
  331.          Wait 50
  332.       End If 
  333.       Erase 10
  334.    Else 
  335.       Locate 1,6 : Print "File not found"
  336.       Wait 50
  337.    End If 
  338.    If T$=""
  339.       Screen Close 3
  340.       Screen SCR
  341.    End If 
  342. End Proc
  343. Procedure _OPENPROJ[T$]
  344.    SCR=Screen
  345.    Screen Open 3,640,64,2,Hires
  346.    Flash Off : Cls 0 : Palette $8,$FF0
  347.    Locate 1,1 : Print "LOAD PROJECT"
  348.    If T$=""
  349.       If _PROJ$<>""
  350.          Locate 1,2 : Print "(current project : ";_PROJ$;")"
  351.       End If 
  352.       Locate 1,3 : Input "Please enter a project filename:";F$
  353.    Else 
  354.       Locate 1,3 : Print "Loading project : ";T$
  355.       F$=T$
  356.       _PROJ$=T$
  357.    End If 
  358.    Curs Off 
  359.    If Exist(F$)
  360.       _PROJ$=F$
  361.       _INITALL
  362.       Open In 1,F$
  363.       Reserve As Work 10,Lof(1)
  364.       Close 1
  365.       Bload F$,10
  366.       A=Start(10)
  367.       _TNOBJ=Deek(A) : Add A,2
  368.       For N=0 To _TNOBJ-1
  369.          L=Peek(A) : Add A,1
  370.          _FILE$(N)=Peek$(A,L) : Add A,L
  371.       Next 
  372.       A=A+A mod 2 : Rem make sure we're on a word boundary 
  373.       _NOFRAMES=Deek(A) : Add A,2
  374.       For N=0 To _TNOBJ-1
  375.          For F=0 To _NOFRAMES-1
  376.             For D=0 To 2
  377.                _MYDEEK[A] : _ANG(F,N,D)=Param : Add A,2
  378.                _MYDEEK[A] : _POS(F,N,D)=Param : Add A,2
  379.             Next 
  380.          Next 
  381.          _NOSUBOBJ(N)=Deek(A) : Add A,2
  382.          _MYDEEK[A] : _IMASUB(N)=Param : Add A,2
  383.          If _NOSUBOBJ(N)>0
  384.             For S=0 To _NOSUBOBJ(N)-1
  385.                _SUBOBJ(N,S,0)=Deek(A) : Add A,2
  386.                _SUBOBJ(N,S,1)=Deek(A) : Add A,2
  387.             Next 
  388.          End If 
  389.       Next 
  390.       If T$=""
  391.          _SIZE=Deek(A)
  392.       End If 
  393.       Add A,2
  394.       For O=0 To _TNOBJ-1
  395.          For F=0 To _NOFRAMES-1
  396.             For D=0 To 2
  397.                _POS(F,O,D)=(_POS(F,O,D)*_SIZE)/100
  398.             Next 
  399.          Next 
  400.       Next 
  401.       Locate 1,5 : Print "Loading objects..."
  402.       For N=0 To _TNOBJ-1
  403.          Locate 1,6 : Cline : Print Using "##: ";N;_FILE$(N)
  404.          _LOADOBJ[_FILE$(N)]
  405.       Next 
  406.       Locate 1,5 : Cline : Print "Updating screen..."
  407.       Screen SCR
  408.       _FRAME=0
  409.       _UPDATE
  410.    Else 
  411.       Locate 1,5 : Print "File not found"
  412.       Wait 50
  413.    End If 
  414.    Screen Close 3
  415.    Screen SCR
  416.    If _FRAME>=_NOFRAMES
  417.       _FRAME=_NOFRAMES-1
  418.       _UPDATE
  419.    End If 
  420.    _MAKEFRAME
  421. End Proc
  422. Procedure _SAVEPROJ
  423.    SCR=Screen
  424.    Screen Open 3,640,64,2,Hires
  425.    Flash Off : Cls 0 : Palette $8,$FF0
  426.    Locate 1,1 : Print "SAVE PROJECT"
  427.    Locate 1,3 : Input "Please enter a name for this project:";F$
  428.    If F$="" : Goto _DONTSAVE : End If 
  429.    If Exist(F$)
  430.       Locate 1,5 : Print "This project already exists, overwrite? (Y/N)"
  431.       Repeat 
  432.          I$=Upper$(Inkey$)
  433.       Until Instr("YN",I$)>0
  434.       If I$="N"
  435.          Goto _DONTSAVE
  436.       End If 
  437.    End If 
  438.    Reserve As Work 10,64000
  439.    A=Start(10)
  440.    Doke A,_NOBJ : Add A,2
  441.    For N=0 To _NOBJ-1
  442.       Poke A,Len(_FILE$(N)) : Inc A
  443.       Poke$ A,_FILE$(N) : Add A,Len(_FILE$(N))
  444.    Next 
  445.    A=A+A mod 2 : Rem make sure we're on an even address boundary
  446.    Doke A,_NOFRAMES : Add A,2
  447.    For N=0 To _NOBJ-1
  448.       For F=0 To _NOFRAMES-1
  449.          For D=0 To 2
  450.             Doke A,_ANG(F,N,D) : Add A,2
  451.             Doke A,_POS(F,N,D) : Add A,2
  452.          Next 
  453.       Next 
  454.       Doke A,_NOSUBOBJ(N) : Add A,2
  455.       Doke A,_IMASUB(N) : Add A,2
  456.       If _NOSUBOBJ(N)>0
  457.          For S=0 To _NOSUBOBJ(N)-1
  458.             Doke A,_SUBOBJ(N,S,0) : Add A,2
  459.             Doke A,_SUBOBJ(N,S,1) : Add A,2
  460.          Next 
  461.       End If 
  462.    Next 
  463.    Doke A,_SIZE : Add A,2
  464.    Bsave F$,Start(10) To A
  465.    Erase 10
  466.    _DONTSAVE:
  467.    Screen Close 3
  468.    Screen SCR
  469. End Proc
  470. Procedure _GETCOORDS[XX,YY]
  471.    Z=Zone(XX,YY)
  472.    If Z>0 and Z<4
  473.       If Z=1
  474.          X=XX/SCALE#
  475.          Y=(YY-128)/SCALE#
  476.          XRET=XO+X
  477.          YRET=0
  478.          ZRET=ZO-Y
  479.       Else If Z=2
  480.          X=XX/SCALE#
  481.          Y=(YY-256)/SCALE#
  482.          XRET=XO+X
  483.          YRET=YO-Y
  484.          ZRET=0
  485.       Else If Z=3
  486.          X=(XX-160)/SCALE#
  487.          Y=(YY-256)/SCALE#
  488.          XRET=0
  489.          YRET=YO-Y
  490.          ZRET=ZO+X
  491.       End If 
  492.    Else 
  493.       XRET=0
  494.       YRET=0
  495.       ZRET=0
  496.    End If 
  497. End Proc
  498. Procedure _MAKECOORDS
  499.    SCR=Screen
  500.    _GETCOORDS[X Screen(X Mouse),Y Screen(Y Mouse)]
  501.    Screen 2
  502.    _MAKESTRING[XRET]
  503.    _MAKENUM[Param$]
  504.    Get Bob 11,0,0 To 16,5
  505.    _MAKESTRING[YRET]
  506.    _MAKENUM[Param$]
  507.    Get Bob 12,0,0 To 16,5
  508.    _MAKESTRING[ZRET]
  509.    _MAKENUM[Param$]
  510.    Get Bob 13,0,0 To 16,5
  511.    Screen SCR
  512. End Proc
  513. Procedure _MAKESTRING[N]
  514.    T$=Str$(N)-" "-"-"
  515.    If Len(T$)<3
  516.       T$=String$("0",3-Len(T$))+T$
  517.    End If 
  518.    If N<0
  519.       T$="-"+T$
  520.    Else 
  521.       T$=" "+T$
  522.    End If 
  523. End Proc[T$]
  524. Procedure _MAKENUM[T$]
  525.    Cls 0,0,0 To 16,6
  526.    Ink 1
  527.    For N=1 To Len(T$)
  528.       TT$=Mid$(T$,N,1)
  529.       If TT$="-"
  530.          Draw 0,2 To 2,2
  531.       Else If TT$<>" "
  532.          Paste Bob(N-1)*4,0,Val(TT$)+1
  533.       End If 
  534.    Next 
  535. End Proc
  536. Procedure _SCRCLIP[Z]
  537.    If Z=1 : Clip 1,1 To 159,127
  538.    Else If Z=2 : Clip 1,129 To 159,254
  539.    Else If Z=3 : Clip 161,129 To 318,254
  540.    Else If Z=4 : Clip 161,1 To 318,127
  541.    Else : Clip 
  542.    End If 
  543. End Proc
  544. Procedure _MOVEAXISRIGHT
  545.    Z=Mouse Zone
  546.    M=4/SCALE#
  547.    If M<1
  548.       M=1
  549.    End If 
  550.    If Z=1
  551.       'overhead view 
  552.       XO=XO-M
  553.    Else If Z=2
  554.       'front view
  555.       XO=XO-M
  556.    Else If Z=3
  557.       'side view 
  558.       ZO=ZO-M
  559.    End If 
  560.    _ROTATED=False
  561.    _REDRAW
  562. End Proc
  563. Procedure _MOVEAXISLEFT
  564.    Z=Mouse Zone
  565.    M=4/SCALE#
  566.    If M<1
  567.       M=1
  568.    End If 
  569.    If Z=1
  570.       'overhead view 
  571.       XO=XO+M
  572.    Else If Z=2
  573.       'front view
  574.       XO=XO+M
  575.    Else If Z=3
  576.       'side view 
  577.       ZO=ZO+M
  578.    End If 
  579.    _ROTATED=False
  580.    _REDRAW
  581. End Proc
  582. Procedure _MOVEAXISUP
  583.    Z=Mouse Zone
  584.    M=4/SCALE#
  585.    If M<1
  586.       M=1
  587.    End If 
  588.    If Z=1
  589.       'overhead view 
  590.       ZO=ZO+M
  591.    Else If Z=2
  592.       'front view
  593.       YO=YO+M
  594.    Else If Z=3
  595.       'side view 
  596.       YO=YO+M
  597.    End If 
  598.    _ROTATED=False
  599.    _REDRAW
  600. End Proc
  601. Procedure _MOVEAXISDOWN
  602.    Z=Mouse Zone
  603.    M=4/SCALE#
  604.    If M<1
  605.       M=1
  606.    End If 
  607.    If Z=1
  608.       'overhead view 
  609.       ZO=ZO-M
  610.    Else If Z=2
  611.       'front view
  612.       YO=YO-M
  613.    Else If Z=3
  614.       'side view 
  615.       YO=YO-M
  616.    End If 
  617.    _ROTATED=False
  618.    _REDRAW
  619. End Proc
  620. Procedure _ZOOMIN
  621.    If SCALE#<8
  622.       SCALE#=SCALE#*2
  623.       XO=XO/2
  624.       YO=YO/2
  625.       ZO=ZO/2
  626.    End If 
  627.    _ROTATED=False
  628. End Proc
  629. Procedure _ZOOMOUT
  630.    If SCALE#>0.25
  631.       SCALE#=SCALE#/2
  632.       XO=XO*2
  633.       YO=YO*2
  634.       ZO=ZO*2
  635.    End If 
  636.    If SCALE#<1
  637.       XO=XO-(XO mod(1/SCALE#))
  638.       YO=YO-(YO mod(1/SCALE#))
  639.       ZO=ZO-(ZO mod(1/SCALE#))
  640.    End If 
  641.    _ROTATED=False
  642. End Proc
  643. Procedure _JOIN[X1,Y1,Z1,X2,Y2,Z2,C]
  644.    Ink C
  645.    X1=(X1-XO)*SCALE# : Y1=(Y1-YO)*SCALE# : Z1=(Z1-ZO)*SCALE#
  646.    X2=(X2-XO)*SCALE# : Y2=(Y2-YO)*SCALE# : Z2=(Z2-ZO)*SCALE#
  647.    'overhead view 
  648.    _SCRCLIP[1]
  649.    Draw X1,128-Z1 To X2,128-Z2
  650.    'front view
  651.    _SCRCLIP[2]
  652.    Draw X1,256-Y1 To X2,256-Y2
  653.    'side view 
  654.    _SCRCLIP[3]
  655.    Draw 160+Z1,256-Y1 To 160+Z2,256-Y2
  656.    Clip 
  657. End Proc
  658. Procedure _HIGHPOINT[P,C]
  659.    If Not _ROTATED
  660.       _ROTPOINTS[-1]
  661.    End If 
  662.    X1=_PVRPT(P,0) : Y1=_PVRPT(P,1) : Z1=_PVRPT(P,2)
  663.    Ink C
  664.    X1=(X1-XO)*SCALE# : Y1=(Y1-YO)*SCALE# : Z1=(Z1-ZO)*SCALE#
  665.    'overhead view 
  666.    _SCRCLIP[1]
  667.    Box X1-1,127-Z1 To X1+1,129-Z1
  668.    'front view
  669.    _SCRCLIP[2]
  670.    Box X1-1,255-Y1 To X1+1,257-Y1
  671.    'side view 
  672.    _SCRCLIP[3]
  673.    Box 159+Z1,255-Y1 To 161+Z1,257-Y1
  674.    Clip 
  675. End Proc
  676. Procedure _MYDEEK[A]
  677.    D=Deek(A)
  678.    If D>32767
  679.       D=D-65536
  680.    End If 
  681. End Proc[D]
  682. Procedure _ROTPERSPVIEW
  683.    _REDRAW
  684.    XS=_YROT-X Screen(X Mouse)
  685.    YS=_XROT-Y Screen(Y Mouse)
  686.    Set Paint 1 : Ink 0,0,1
  687.    Repeat 
  688.       _YROT=XS+X Screen(X Mouse)
  689.       _XROT=YS+Y Screen(Y Mouse)
  690.       Screen 2
  691.       _MAKESTRING[_XROT] : _MAKENUM[Param$] : Get Bob 11,0,0 To 16,6
  692.       _MAKESTRING[_YROT] : _MAKENUM[Param$] : Get Bob 12,0,0 To 16,6
  693.       Screen 0
  694.       _ROTATED=False
  695.       _DRAWPERSP[-1]
  696.       Wait Vbl 
  697.       Screen Swap 
  698.       Sprite Off 10
  699.       Sprite Off 11
  700.       Sprite 10,_CXP,_CYP+6,12
  701.       Sprite 11,_CXP,_CYP+12,11
  702.    Until Mouse Key=0
  703.    Set Paint 0
  704. End Proc
  705. Procedure _ROTPOINTS[O]
  706.    _XROT=(_XROT+360) mod 360
  707.    _YROT=(_YROT+360) mod 360
  708.    If O<0
  709.       For P=0 To _NPTS-1
  710.          N=_PTASSOC(P)
  711.          XA=(360+_ANG(_FRAME,N,0)) mod 360
  712.          YA=(360+_ANG(_FRAME,N,1)) mod 360
  713.          ZA=(360+_ANG(_FRAME,N,2)) mod 360
  714.          X1=_PT(P,0) : Y1=_PT(P,1) : Z1=_PT(P,2)
  715.          SX=_SIN(XA) : CX=_COS(XA)
  716.          SY=_SIN(YA) : CY=_COS(YA)
  717.          SZ=_SIN(ZA) : CZ=_COS(ZA)
  718.          T=(Z1*CX-Y1*SX)/32768 : Y1=(Z1*SX+Y1*CX)/32768 : Z1=T
  719.          T=(X1*CY-Z1*SY)/32768 : Z1=(X1*SY+Z1*CY)/32768 : X1=T
  720.          T=(Y1*CZ-X1*SZ)/32768 : X1=(Y1*SZ+X1*CZ)/32768 : Y1=T
  721.          X1=X1+_POS(_FRAME,N,0) : Y1=Y1+_POS(_FRAME,N,1) : Z1=Z1+_POS(_FRAME,N,2)
  722.          _PVRPT(P,0)=X1
  723.          _PVRPT(P,1)=Y1
  724.          _PVRPT(P,2)=Z1
  725.          _RPT(P,0)=X1*100
  726.          _RPT(P,1)=Y1*100
  727.          _RPT(P,2)=Z1*100
  728.          T=(_RPT(P,0)*_COS(_YROT)-_RPT(P,2)*_SIN(_YROT))/32768
  729.          _RPT(P,2)=(_RPT(P,0)*_SIN(_YROT)+_RPT(P,2)*_COS(_YROT))/32768
  730.          _RPT(P,0)=T
  731.          T=(_RPT(P,2)*_COS(_XROT)-_RPT(P,1)*_SIN(_XROT))/32768
  732.          _RPT(P,1)=(_RPT(P,2)*_SIN(_XROT)+_RPT(P,1)*_COS(_XROT))/32768
  733.          _RPT(P,2)=T
  734.          _RPT(P,0)=_RPT(P,0)-(XO*SCALE#+80)*100
  735.          _RPT(P,1)=_RPT(P,1)-(YO*SCALE#+64)*100
  736.          _RPT(P,2)=_RPT(P,2)-(ZO*SCALE#+80)*100
  737.          _XP(P)=SCALE#*(500*_RPT(P,0))/(50000+_RPT(P,2))+240
  738.          _YP(P)=64-SCALE#*(500*_RPT(P,1))/(50000+_RPT(P,2))
  739.       Next 
  740.       For N=0 To _NOBJ-1
  741.          PT=_MIDPT(N)
  742.          '      _DIST(N)=_RPT(PT,2)+50000 
  743.          _DIST(N)=_RPT(PT,0)^2+_RPT(PT,1)^2+(_RPT(PT,2)+15000)^2
  744.          _ORDER(N)=N
  745.       Next 
  746.    Else 
  747.       For P=0 To _NPTS-1
  748.          N=_PTASSOC(P)
  749.          If N=O
  750.             XA=(360+_ANG(_FRAME,N,0)) mod 360
  751.             YA=(360+_ANG(_FRAME,N,1)) mod 360
  752.             ZA=(360+_ANG(_FRAME,N,2)) mod 360
  753.             X1=_PT(P,0) : Y1=_PT(P,1) : Z1=_PT(P,2)
  754.             SX=_SIN(XA) : CX=_COS(XA)
  755.             SY=_SIN(YA) : CY=_COS(YA)
  756.             SZ=_SIN(ZA) : CZ=_COS(ZA)
  757.             T=(Z1*CX-Y1*SX)/32768 : Y1=(Z1*SX+Y1*CX)/32768 : Z1=T
  758.             T=(X1*CY-Z1*SY)/32768 : Z1=(X1*SY+Z1*CY)/32768 : X1=T
  759.             T=(Y1*CZ-X1*SZ)/32768 : X1=(Y1*SZ+X1*CZ)/32768 : Y1=T
  760.             X1=X1+_POS(_FRAME,N,0) : Y1=Y1+_POS(_FRAME,N,1) : Z1=Z1+_POS(_FRAME,N,2)
  761.             _PVRPT(P,0)=X1
  762.             _PVRPT(P,1)=Y1
  763.             _PVRPT(P,2)=Z1
  764.             _RPT(P,0)=X1*100
  765.             _RPT(P,1)=Y1*100
  766.             _RPT(P,2)=Z1*100
  767.             T=(_RPT(P,0)*_COS(_YROT)-_RPT(P,2)*_SIN(_YROT))/32768
  768.             _RPT(P,2)=(_RPT(P,0)*_SIN(_YROT)+_RPT(P,2)*_COS(_YROT))/32768
  769.             _RPT(P,0)=T
  770.             T=(_RPT(P,2)*_COS(_XROT)-_RPT(P,1)*_SIN(_XROT))/32768
  771.             _RPT(P,1)=(_RPT(P,2)*_SIN(_XROT)+_RPT(P,1)*_COS(_XROT))/32768
  772.             _RPT(P,2)=T
  773.             _RPT(P,0)=_RPT(P,0)-(XO*SCALE#+80)*100
  774.             _RPT(P,1)=_RPT(P,1)-(YO*SCALE#+64)*100
  775.             _RPT(P,2)=_RPT(P,2)-(ZO*SCALE#+80)*100
  776.             _XP(P)=SCALE#*(500*_RPT(P,0))/(50000+_RPT(P,2))+240
  777.             _YP(P)=64-SCALE#*(500*_RPT(P,1))/(50000+_RPT(P,2))
  778.          End If 
  779.       Next 
  780.    End If 
  781.    _ROTATED=True
  782. End Proc
  783. Procedure _DRAWPERSP[SO]
  784.    If Not _ROTATED
  785.       _ROTPOINTS[SO]
  786.    End If 
  787.    Clip 161,1 To 318,127
  788.    If SO=-1
  789.       For A=_NOBJ-2 To 0 Step -1
  790.          For B=0 To A
  791.             If _DIST(_ORDER(B))<_DIST(_ORDER(B+1))
  792.                Swap _ORDER(B),_ORDER(B+1)
  793.             End If 
  794.          Next 
  795.       Next 
  796.       Cls 0,161,1 To 318,127
  797.       For OO=0 To _NOBJ-1
  798.          O=_ORDER(OO)
  799.          For P=0 To _NOP(O)
  800.             PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2)
  801.             D=(_XP(PT3)-_XP(PT1))*(_YP(PT2)-_YP(PT1))-(_YP(PT3)-_YP(PT1))*(_XP(PT2)-_XP(PT1))
  802.             If D<0
  803.                If _NOS(O,P)=2
  804.                   PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2)
  805.                   Polygon _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) To _XP(PT3),_YP(PT3)
  806.                Else If _NOS(O,P)=3
  807.                   PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2) : PT4=_PGN(O,P,3)
  808.                   Polygon _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) To _XP(PT3),_YP(PT3) To _XP(PT4),_YP(PT4)
  809.                Else If _NOS(O,P)=4
  810.                   PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2) : PT4=_PGN(O,P,3) : PT5=_PGN(O,P,4)
  811.                   Polygon _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) To _XP(PT3),_YP(PT3) To _XP(PT4),_YP(PT4) To _XP(PT5),_YP(PT5)
  812.                Else If _NOS(O,P)=5
  813.                   PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2) : PT4=_PGN(O,P,3) : PT5=_PGN(O,P,4) : PT6=_PGN(O,P,5)
  814.                   Polygon _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) To _XP(PT3),_YP(PT3) To _XP(PT4),_YP(PT4) To _XP(PT5),_YP(PT5) To _XP(PT6),_YP(PT6)
  815.                Else If _NOS(O,P)=6
  816.                   PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2) : PT4=_PGN(O,P,3) : PT5=_PGN(O,P,4) : PT6=_PGN(O,P,5) : PT7=_PGN(O,P,6)
  817.                   Polygon _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) To _XP(PT3),_YP(PT3) To _XP(PT4),_YP(PT4) To _XP(PT5),_YP(PT5) To _XP(PT6),_YP(PT6) To _XP(PT7),_YP(PT7)
  818.                Else If _NOS(O,P)=7
  819.                   PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2) : PT4=_PGN(O,P,3) : PT5=_PGN(O,P,4) : PT6=_PGN(O,P,5) : PT7=_PGN(O,P,6) : PT8=_PGN(O,P,7)
  820.                   Polygon _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) To _XP(PT3),_YP(PT3) To _XP(PT4),_YP(PT4) To _XP(PT5),_YP(PT5) To _XP(PT6),_YP(PT6) To _XP(PT7),_YP(PT7) To _XP(PT8),_YP(PT8)
  821.                Else 
  822.                   Bell 20 : Wait 5 : Play Off 
  823.                End If 
  824.                '               PT1=_PGN(O,P,0)
  825.                '               For S=1 To _NOS(O,P)+1 
  826.                '                  PT2=_PGN(O,P,S) 
  827.                '                  Draw _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2) 
  828.                '                  PT1=PT2 
  829.                '               Next 
  830.             End If 
  831.          Next 
  832.       Next 
  833.    Else 
  834.       O=SO
  835.       For P=0 To _NOP(O)
  836.          PT1=_PGN(O,P,0) : PT2=_PGN(O,P,1) : PT3=_PGN(O,P,2)
  837.          D=(_XP(PT3)-_XP(PT1))*(_YP(PT2)-_YP(PT1))-(_YP(PT3)-_YP(PT1))*(_XP(PT2)-_XP(PT1))
  838.          If D<0
  839.             PT1=_PGN(O,P,0)
  840.             For S=1 To _NOS(O,P)+1
  841.                PT2=_PGN(O,P,S)
  842.                Draw _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2)
  843.                PT1=PT2
  844.             Next 
  845.          End If 
  846.       Next 
  847.    End If 
  848.    Clip 
  849. End Proc
  850. Procedure _SELECTOBJECT
  851.    If Not _ROTATED
  852.       _ROTPOINTS[-1]
  853.    End If 
  854.    O=-1
  855.    If _NOBJ>0
  856.       Z=Mouse Zone
  857.       _GETCOORDS[X Screen(X Mouse),Y Screen(Y Mouse)]
  858.       If Z=1
  859.          'overhead view 
  860.          DIST=999999 : O=-1
  861.          For N=0 To _NOBJ-1
  862.             D=Sqr((XRET-_PVRPT(_MIDPT(N),0))^2+(ZRET-_PVRPT(_MIDPT(N),2))^2)
  863. '            D=Sqr((XRET-_POS(_FRAME,N,0))^2+(ZRET-_POS(_FRAME,N,2))^2)
  864.             If D<DIST
  865.                O=N
  866.                DIST=D
  867.             End If 
  868.          Next 
  869.       Else If Z=2
  870.          'front view  
  871.          DIST=999999 : O=-1
  872.          For N=0 To _NOBJ-1
  873.             D=Sqr((XRET-_PVRPT(_MIDPT(N),0))^2+(YRET-_PVRPT(_MIDPT(N),1))^2)
  874. '            D=Sqr((XRET-_POS(_FRAME,N,0))^2+(YRET-_POS(_FRAME,N,1))^2)
  875.             If D<DIST
  876.                O=N
  877.                DIST=D
  878.             End If 
  879.          Next 
  880.       Else If Z=3
  881.          'side view 
  882.          DIST=999999 : O=-1
  883.          For N=0 To _NOBJ-1
  884.             D=Sqr((YRET-_PVRPT(_MIDPT(N),1))^2+(ZRET-_PVRPT(_MIDPT(N),2))^2)
  885. '            D=Sqr((YRET-_POS(_FRAME,N,1))^2+(ZRET-_POS(_FRAME,N,2))^2)
  886.             If D<DIST
  887.                O=N
  888.                DIST=D
  889.             End If 
  890.          Next 
  891.       End If 
  892.    Else 
  893.       O=-1
  894.    End If 
  895.    If O=-1
  896.       Bell 20 : Wait 5 : Play Off 
  897.    End If 
  898. End Proc[O]
  899. Procedure _HIGHOBJ[N,C]
  900.    If Not _ROTATED
  901.       _ROTPOINTS[N]
  902.    End If 
  903.    For P=0 To _NOP(N)-1
  904.       PP=_PGN(N,P,0)
  905.       X1=_PVRPT(PP,0) : Y1=_PVRPT(PP,1) : Z1=_PVRPT(PP,2)
  906.       For S=1 To _NOS(N,P)+1
  907.          PP=_PGN(N,P,S)
  908.          X2=_PVRPT(PP,0) : Y2=_PVRPT(PP,1) : Z2=_PVRPT(PP,2)
  909.          _JOIN[X1,Y1,Z1,X2,Y2,Z2,C]
  910.          X1=X2 : Y1=Y2 : Z1=Z2
  911.       Next 
  912.    Next 
  913.    _DRAWPERSP[N]
  914. End Proc
  915. Procedure _MOVE
  916.    If _SELOBJ>=0
  917.       If _IMASUB(_SELOBJ)
  918.          'you cannot move sub-objects 
  919.          Bell 20 : Wait 5 : Play Off 
  920.       Else 
  921.          X=X Screen(X Mouse)
  922.          Y=Y Screen(Y Mouse)
  923.          Z=Mouse Zone
  924.          Screen Open 4,320,256,8,Lowres : Screen To Back 4
  925.          Screen 0
  926.          _CLEARSCREEN
  927.          For N=0 To _NOBJ-1
  928.             If N<>_SELOBJ
  929.                _HIGHOBJ[N,1]
  930.             End If 
  931.          Next 
  932.          Screen Copy 0 To 4
  933.          If Z=1 : _MOVEZX[X,Y]
  934.          Else If Z=2 : _MOVEXY[X,Y]
  935.          Else If Z=3 : _MOVEYZ[X,Y]
  936.          End If 
  937.          Screen Close 4
  938.          _MOVESUB[_SELOBJ]
  939.          _REDRAW
  940.       End If 
  941.    End If 
  942. End Proc
  943. Procedure _MOVEXY[X,Y]
  944.    XS=_POS(_FRAME,_SELOBJ,0)-(X/SCALE#)
  945.    YS=_POS(_FRAME,_SELOBJ,1)+(Y/SCALE#)
  946.    TX=X : TY=Y
  947.    Repeat 
  948.       Repeat 
  949.          XM=X Screen(X Mouse)
  950.          YM=Y Screen(Y Mouse)
  951.       Until(TX<>XM) or(TY<>YM) or(Mouse Key=0)
  952.       TX=XM : TY=YM
  953.       _POS(_FRAME,_SELOBJ,0)=XS+(XM/SCALE#)
  954.       _POS(_FRAME,_SELOBJ,1)=YS-(YM/SCALE#)
  955. '      _MOVESUB[_SELOBJ] 
  956.       _ROTATED=False
  957.       Wait Vbl 
  958.       Screen Copy 4 To 0
  959. '      _REDRAW 
  960. 'Screen Swap 
  961. '      _HIGHSUB[_SELOBJ,3] 
  962.       _HIGHOBJ[_SELOBJ,3]
  963. Screen Swap 
  964.    Until Mouse Key=0
  965. End Proc
  966. Procedure _MOVEYZ[X,Y]
  967.    ZS=_POS(_FRAME,_SELOBJ,2)-(X/SCALE#)
  968.    YS=_POS(_FRAME,_SELOBJ,1)+(Y/SCALE#)
  969.    TX=X : TY=Y
  970.    Repeat 
  971.       Repeat 
  972.          XM=X Screen(X Mouse)
  973.          YM=Y Screen(Y Mouse)
  974.       Until(TX<>XM) or(TY<>YM) or(Mouse Key=0)
  975.       TX=XM : TY=YM
  976.       _POS(_FRAME,_SELOBJ,2)=ZS+(XM/SCALE#)
  977.       _POS(_FRAME,_SELOBJ,1)=YS-(YM/SCALE#)
  978.       _MOVESUB[_SELOBJ]
  979.       _ROTATED=False
  980.       Wait Vbl 
  981.       Screen Copy 4 To 0
  982.       _HIGHOBJ[_SELOBJ,3]
  983.       Screen Swap 
  984.    Until Mouse Key=0
  985. End Proc
  986. Procedure _MOVEZX[X,Y]
  987.    XS=_POS(_FRAME,_SELOBJ,0)-(X/SCALE#)
  988.    ZS=_POS(_FRAME,_SELOBJ,2)+(Y/SCALE#)
  989.    TX=X : TY=Y
  990.    Repeat 
  991.       Repeat 
  992.          XM=X Screen(X Mouse)
  993.          YM=Y Screen(Y Mouse)
  994.       Until(TX<>XM) or(TY<>YM) or(Mouse Key=0)
  995.       TX=XM : TY=YM
  996.       _POS(_FRAME,_SELOBJ,0)=XS+(XM/SCALE#)
  997.       _POS(_FRAME,_SELOBJ,2)=ZS-(YM/SCALE#)
  998.       _MOVESUB[_SELOBJ]
  999.       _ROTATED=False
  1000.       Wait Vbl 
  1001.       Screen Copy 4 To 0
  1002.       _HIGHOBJ[_SELOBJ,3]
  1003.       Screen Swap 
  1004.    Until Mouse Key=0
  1005. End Proc
  1006. Procedure _NEXTOBJ
  1007.    If _NOBJ>0
  1008.       Add _SELOBJ,1,0 To _NOBJ-1
  1009.    Else 
  1010.       _SELOBJ=-1
  1011.    End If 
  1012.    _REDRAW
  1013. End Proc
  1014. Procedure _PREVIOUSOBJ
  1015.    If _NOBJ>0
  1016.       Add _SELOBJ,-1,0 To _NOBJ-1
  1017.    Else 
  1018.       _SELOBJ=-1
  1019.    End If 
  1020.    _REDRAW
  1021. End Proc
  1022. Procedure _ROTATE
  1023.    If _SELOBJ>=0
  1024.       X=X Screen(X Mouse)
  1025.       Y=Y Screen(Y Mouse)
  1026.       Z=Mouse Zone
  1027.       Screen Open 4,320,256,8,Lowres : Screen To Back 4
  1028.       Screen 0
  1029.       _CLEARSCREEN
  1030.       For N=0 To _NOBJ-1
  1031.          If N<>_SELOBJ
  1032.             _HIGHOBJ[N,1]
  1033.          End If 
  1034.       Next 
  1035.       Screen Copy 0 To 4
  1036.       If Z=1 : _ROTZX[X,Y]
  1037.       Else If Z=2 : _ROTXY[X,Y]
  1038.       Else If Z=3 : _ROTYZ[X,Y]
  1039.       End If 
  1040.       Screen Close 4
  1041.       _MOVESUB[_SELECTED]
  1042.       _REDRAW
  1043.    End If 
  1044. End Proc
  1045. Procedure _ROTXY[X,Y]
  1046.    XS=_ANG(_FRAME,_SELOBJ,2)-(X/SCALE#)
  1047.    TX=X
  1048.    Repeat 
  1049.       Repeat 
  1050.          XM=X Screen(X Mouse)
  1051.       Until(TX<>XM) or(Mouse Key=0)
  1052.       TX=XM
  1053.       _ANG(_FRAME,_SELOBJ,2)=XS+(XM/SCALE#)
  1054.       _ROTATED=False
  1055.       Wait Vbl 
  1056.       Screen Copy 4 To 0
  1057.       _HIGHOBJ[_SELOBJ,3]
  1058.       Screen Swap 
  1059.    Until Mouse Key=0
  1060. End Proc
  1061. Procedure _ROTYZ[X,Y]
  1062.    XS=_ANG(_FRAME,_SELOBJ,0)-(X/SCALE#)
  1063.    TX=X
  1064.    Repeat 
  1065.       Repeat 
  1066.          XM=X Screen(X Mouse)
  1067.       Until(TX<>XM) or(Mouse Key=0)
  1068.       TX=XM
  1069.       _ANG(_FRAME,_SELOBJ,0)=XS+(XM/SCALE#)
  1070.       _ROTATED=False
  1071.       Wait Vbl 
  1072.       Screen Copy 4 To 0
  1073.       _HIGHOBJ[_SELOBJ,3]
  1074.       Screen Swap 
  1075.    Until Mouse Key=0
  1076. End Proc
  1077. Procedure _ROTZX[X,Y]
  1078.    XS=_ANG(_FRAME,_SELOBJ,1)-(X/SCALE#)
  1079.    TX=X
  1080.    Repeat 
  1081.       Repeat 
  1082.          XM=X Screen(X Mouse)
  1083.       Until(TX<>XM) or(Mouse Key=0)
  1084.       TX=XM
  1085.       _ANG(_FRAME,_SELOBJ,1)=XS+(XM/SCALE#)
  1086.       _ROTATED=False
  1087.       Wait Vbl 
  1088.       Screen Copy 4 To 0
  1089.       _HIGHOBJ[_SELOBJ,3]
  1090.       Screen Swap 
  1091.    Until Mouse Key=0
  1092. End Proc
  1093. Procedure _MAKEFRAME
  1094.    SCR=Screen
  1095.    Screen 2
  1096.    _MAKESTRING[_FRAME+1] : _MAKENUM[Param$]
  1097.    Get Bob 17,4,0 To 16,5
  1098.    _MAKESTRING[_NOFRAMES] : _MAKENUM[Param$]
  1099.    Get Bob 18,4,0 To 16,5
  1100.    Cls 0
  1101.    Paste Bob 0,0,16
  1102.    Paste Bob 24,0,17
  1103.    Paste Bob 40,0,18
  1104.    Get Bob 17,0,0 To 51,5
  1105.    Screen SCR
  1106.    Sprite 8,X Hard(162),Y Hard(116),17
  1107. End Proc
  1108. Procedure _NEXTFRAME
  1109.    Inc _FRAME
  1110.    If _FRAME=_NOFRAMES
  1111.       SCR=Screen
  1112.       Screen Open 4,640,64,2,Hires : Flash Off : Curs Off : Palette $8,$FF0
  1113.       Locate 1,1 : Print "This is the last frame, shall I add another? (Y/N)"
  1114.       Locate 1,2 : Print "(press escape to cancel and return to the current frame)"
  1115.       Repeat 
  1116.          I$=Upper$(Inkey$)
  1117.       Until I$="Y" or I$="N" or I$=Chr$(27)
  1118.       If I$="N"
  1119.          _FRAME=0
  1120.       Else If I$=Chr$(27)
  1121.          Dec _FRAME
  1122.       Else If I$="Y"
  1123.          Cls 0
  1124.          Inc _NOFRAMES
  1125.          Locate 1,1 : Print "Please wait, creating new frame..."
  1126.          For O=0 To _MAXNOBJ
  1127.             For I=0 To 2
  1128.                _POS(_FRAME,O,I)=_POS(_FRAME-1,O,I)
  1129.                _ANG(_FRAME,O,I)=_ANG(_FRAME-1,O,I)
  1130.             Next 
  1131.          Next 
  1132.       End If 
  1133.       Screen Close 4 : Screen SCR
  1134.    End If 
  1135.    _MAKEFRAME
  1136.    _MOVESUB[-1]
  1137.    _REDRAW
  1138. End Proc
  1139. Procedure _PREVFRAME
  1140.    Dec _FRAME
  1141.    If _FRAME<0
  1142.       _FRAME=_NOFRAMES-1
  1143.    End If 
  1144.    _MOVESUB[-1]
  1145.    _REDRAW
  1146.    _MAKEFRAME
  1147. End Proc
  1148. Procedure _TWEEN
  1149.    If _NOBJ>0
  1150.       SCR=Screen
  1151.       Screen Open 4,640,64,2,Hires
  1152.       Flash Off : Curs Off : Cls 0 : Palette $8,$FF0
  1153.       Locate 1,1 : Print "Tween!!!"
  1154.       Locate 1,3 : Print "Which objects do you wish to tween?"
  1155.       Locate 1,4 : Print "[A]  All of them"
  1156.       Locate 1,5 : Print "[S]  Just the selected object"
  1157.       Locate 1,7 : Print "(press escape to cancel)"
  1158.       Repeat 
  1159.          I$=Upper$(Inkey$)
  1160.       Until I$="A" or I$="S" or I$=Chr$(27)
  1161.       Cls 0
  1162.       If I$=Chr$(27)
  1163.          Locate 1,1 : Print "Tweening canceled..."
  1164.          Wait 50
  1165.       Else 
  1166.          If I$="A" or _SELOBJ>=0
  1167.             Locate 1,1 : Print Using "Current Frame    : ###";_FRAME+1
  1168.             Locate 1,2 : Print Using "Number of frames : ###";_NOFRAMES
  1169.             Locate 1,4 : Input "Enter start frame:";SF$
  1170.             SF=Val(SF$)-1
  1171.             Locate 1,5 : Input "Enter end frame  :";EF$
  1172.             Curs Off 
  1173.             EF=Val(EF$)-1
  1174.             If SF>EF
  1175.                Swap SF,EF
  1176.             End If 
  1177.             If(EF-SF)<=1
  1178.                Locate 1,7 : Print "That was hard!";
  1179.                Wait 20
  1180.                Print "  NOT!!!";
  1181.                Wait 30
  1182.             Else 
  1183.                If(SF<0) or(EF>_NOFRAMES-1)
  1184.                   Locate 1,7 : Print "Tweening to non-existant frames is not possible!"
  1185.                   Wait 50
  1186.                Else 
  1187.                   Cls 0
  1188.                   Locate 1,1 : Input "Number of accelleration frames :";AF
  1189.                   Locate 1,2 : Input "number of decelleration frames :";DF
  1190.                   If EF-SF-AF-DF<-1
  1191.                      Locate 1,4 : Print "That's more frames han you want me tween!"
  1192.                      Wait 20
  1193.                      Locate 1,5 : Print "Derrrrr,";
  1194.                      Wait 10
  1195.                      Print " hello."
  1196.                      Wait 10
  1197.                   Else 
  1198.                      If I$="S"
  1199.                         _OF=_FRAME
  1200.                         For N=0 To 40
  1201.                            Screen Display 4,,Y Hard(4,-2),,
  1202.                            Wait Vbl 
  1203.                         Next 
  1204.                         Screen SCR
  1205.                         _SXP=_POS(SF,_SELOBJ,0)
  1206.                         _SYP=_POS(SF,_SELOBJ,1)
  1207.                         _SZP=_POS(SF,_SELOBJ,2)
  1208.                         _EXP=_POS(EF,_SELOBJ,0)
  1209.                         _EYP=_POS(EF,_SELOBJ,1)
  1210.                         _EZP=_POS(EF,_SELOBJ,2)
  1211.                         _SXA=_ANG(SF,_SELOBJ,0)
  1212.                         _SYA=_ANG(SF,_SELOBJ,1)
  1213.                         _SZA=_ANG(SF,_SELOBJ,2)
  1214.                         _EXA=_ANG(EF,_SELOBJ,0)
  1215.                         _EYA=_ANG(EF,_SELOBJ,1)
  1216.                         _EZA=_ANG(EF,_SELOBJ,2)
  1217.                         _DXP=_EXP-_SXP
  1218.                         _DYP=_EYP-_SYP
  1219.                         _DZP=_EZP-_SZP
  1220.                         _DXA=_EXA-_SXA
  1221.                         _DYA=_EYA-_SYA
  1222.                         _DZA=_EZA-_SZA
  1223.                         NF=EF-SF
  1224.                         B=NF-DF
  1225.                         For F=1 To NF-1
  1226.                            If F<AF
  1227.                               _POS(F+SF,_SELOBJ,0)=_SXP+(F^2*_DXP)/(AF*(B+NF-AF))
  1228.                               _POS(F+SF,_SELOBJ,1)=_SYP+(F^2*_DYP)/(AF*(B+NF-AF))
  1229.                               _POS(F+SF,_SELOBJ,2)=_SZP+(F^2*_DZP)/(AF*(B+NF-AF))
  1230.                               _ANG(F+SF,_SELOBJ,0)=_SXA+(F^2*_DXA)/(AF*(B+NF-AF))
  1231.                               _ANG(F+SF,_SELOBJ,1)=_SYA+(F^2*_DYA)/(AF*(B+NF-AF))
  1232.                               _ANG(F+SF,_SELOBJ,2)=_SZA+(F^2*_DZA)/(AF*(B+NF-AF))
  1233.                            Else If F<=B
  1234.                               _POS(F+SF,_SELOBJ,0)=_SXP+(_DXP*(2*F-AF))/(B+NF-AF)
  1235.                               _POS(F+SF,_SELOBJ,1)=_SYP+(_DYP*(2*F-AF))/(B+NF-AF)
  1236.                               _POS(F+SF,_SELOBJ,2)=_SZP+(_DZP*(2*F-AF))/(B+NF-AF)
  1237.                               _ANG(F+SF,_SELOBJ,0)=_SXA+(_DXA*(2*F-AF))/(B+NF-AF)
  1238.                               _ANG(F+SF,_SELOBJ,1)=_SYA+(_DYA*(2*F-AF))/(B+NF-AF)
  1239.                               _ANG(F+SF,_SELOBJ,2)=_SZA+(_DZA*(2*F-AF))/(B+NF-AF)
  1240.                            Else 
  1241.                               PSV#=(_DXP*(2.0*B-AF))/(B+NF-AF)
  1242.                               _POS(F+SF,_SELOBJ,0)=_SXP+PSV#+(((F-B)*_DXP*2.0)-(((F-B)^2)*_DXP)/DF)/(B+NF-A)
  1243.                               PSV#=(_DYP*(2.0*B-AF))/(B+NF-AF)
  1244.                               _POS(F+SF,_SELOBJ,1)=_SYP+PSV#+(((F-B)*_DYP*2.0)-(((F-B)^2)*_DYP)/DF)/(B+NF-A)
  1245.                               PSV#=(_DZP*(2.0*B-AF))/(B+NF-AF)
  1246.                               _POS(F+SF,_SELOBJ,2)=_SZP+PSV#+(((F-B)*_DZP*2.0)-(((F-B)^2)*_DZP)/DF)/(B+NF-A)
  1247.                               PSV#=(_DXA*(2.0*B-AF))/(B+NF-AF)
  1248.                               _ANG(F+SF,_SELOBJ,0)=_SXA+PSV#+(((F-B)*_DXA*2.0)-(((F-B)^2)*_DXA)/DF)/(B+NF-A)
  1249.                               PSV#=(_DYA*(2.0*B-AF))/(B+NF-AF)
  1250.                               _ANG(F+SF,_SELOBJ,1)=_SYA+PSV#+(((F-B)*_DYA*2.0)-(((F-B)^2)*_DYA)/DF)/(B+NF-A)
  1251.                               PSV#=(_DZA*(2.0*B-AF))/(B+NF-AF)
  1252.                               _ANG(F+SF,_SELOBJ,2)=_SZA+PSV#+(((F-B)*_DZA*2.0)-(((F-B)^2)*_DZA)/DF)/(B+NF-A)
  1253.                            End If 
  1254.                            _FRAME=SF+F
  1255.                            _MOVESUB[-1]
  1256.                            _REDRAW
  1257.                         Next 
  1258.                         _FRAME=_OF
  1259.                         _REDRAW
  1260.                      Else 
  1261.                         _OF=_FRAME
  1262.                         For N=0 To 40
  1263.                            Screen Display 4,,Y Hard(4,-2),,
  1264.                            Wait Vbl 
  1265.                         Next 
  1266.                         Screen SCR
  1267.                         NF=EF-SF
  1268.                         For F=1 To NF-1
  1269.                            For O=0 To _NOBJ-1
  1270.                               _SXP=_POS(SF,O,0)
  1271.                               _SYP=_POS(SF,O,1)
  1272.                               _SZP=_POS(SF,O,2)
  1273.                               _EXP=_POS(EF,O,0)
  1274.                               _EYP=_POS(EF,O,1)
  1275.                               _EZP=_POS(EF,O,2)
  1276.                               _SXA=_ANG(SF,O,0)
  1277.                               _SYA=_ANG(SF,O,1)
  1278.                               _SZA=_ANG(SF,O,2)
  1279.                               _EXA=_ANG(EF,O,0)
  1280.                               _EYA=_ANG(EF,O,1)
  1281.                               _EZA=_ANG(EF,O,2)
  1282.                               _DXP=_EXP-_SXP
  1283.                               _DYP=_EYP-_SYP
  1284.                               _DZP=_EZP-_SZP
  1285.                               _DXA=_EXA-_SXA
  1286.                               _DYA=_EYA-_SYA
  1287.                               _DZA=_EZA-_SZA
  1288.                               B=NF-DF
  1289.                               If F<AF
  1290.                                  _POS(F+SF,O,0)=_SXP+(F^2*_DXP)/(AF*(B+NF-AF))
  1291.                                  _POS(F+SF,O,1)=_SYP+(F^2*_DYP)/(AF*(B+NF-AF))
  1292.                                  _POS(F+SF,O,2)=_SZP+(F^2*_DZP)/(AF*(B+NF-AF))
  1293.                                  _ANG(F+SF,O,0)=_SXA+(F^2*_DXA)/(AF*(B+NF-AF))
  1294.                                  _ANG(F+SF,O,1)=_SYA+(F^2*_DYA)/(AF*(B+NF-AF))
  1295.                                  _ANG(F+SF,O,2)=_SZA+(F^2*_DZA)/(AF*(B+NF-AF))
  1296.                               Else If F<=B
  1297.                                  _POS(F+SF,O,0)=_SXP+(_DXP*(2*F-AF))/(B+NF-AF)
  1298.                                  _POS(F+SF,O,1)=_SYP+(_DYP*(2*F-AF))/(B+NF-AF)
  1299.                                  _POS(F+SF,O,2)=_SZP+(_DZP*(2*F-AF))/(B+NF-AF)
  1300.                                  _ANG(F+SF,O,0)=_SXA+(_DXA*(2*F-AF))/(B+NF-AF)
  1301.                                  _ANG(F+SF,O,1)=_SYA+(_DYA*(2*F-AF))/(B+NF-AF)
  1302.                                  _ANG(F+SF,O,2)=_SZA+(_DZA*(2*F-AF))/(B+NF-AF)
  1303.                               Else 
  1304.                                  PSV#=(_DXP*(2.0*B-AF))/(B+NF-AF)
  1305.                                  _POS(F+SF,O,0)=_SXP+PSV#+(((F-B)*_DXP*2.0)-(((F-B)^2)*_DXP)/DF)/(B+NF-A)
  1306.                                  PSV#=(_DYP*(2.0*B-AF))/(B+NF-AF)
  1307.                                  _POS(F+SF,O,1)=_SYP+PSV#+(((F-B)*_DYP*2.0)-(((F-B)^2)*_DYP)/DF)/(B+NF-A)
  1308.                                  PSV#=(_DZP*(2.0*B-AF))/(B+NF-AF)
  1309.                                  _POS(F+SF,O,2)=_SZP+PSV#+(((F-B)*_DZP*2.0)-(((F-B)^2)*_DZP)/DF)/(B+NF-A)
  1310.                                  PSV#=(_DXA*(2.0*B-AF))/(B+NF-AF)
  1311.                                  _ANG(F+SF,O,0)=_SXA+PSV#+(((F-B)*_DXA*2.0)-(((F-B)^2)*_DXA)/DF)/(B+NF-A)
  1312.                                  PSV#=(_DYA*(2.0*B-AF))/(B+NF-AF)
  1313.                                  _ANG(F+SF,O,1)=_SYA+PSV#+(((F-B)*_DYA*2.0)-(((F-B)^2)*_DYA)/DF)/(B+NF-A)
  1314.                                  PSV#=(_DZA*(2.0*B-AF))/(B+NF-AF)
  1315.                                  _ANG(F+SF,O,2)=_SZA+PSV#+(((F-B)*_DZA*2.0)-(((F-B)^2)*_DZA)/DF)/(B+NF-A)
  1316.                               End If 
  1317.                            Next 
  1318.                            _FRAME=F+SF
  1319.                            _MOVESUB[-1]
  1320.                            _REDRAW
  1321.                         Next 
  1322.                         _FRAME=_OF
  1323.                         _REDRAW
  1324.                      End If 
  1325.                   End If 
  1326.                End If 
  1327.             End If 
  1328.          Else 
  1329.             Locate 1,1 : Print "No object selected"
  1330.             Wait 50
  1331.          End If 
  1332.       End If 
  1333.       Screen Close 4
  1334.       Screen SCR
  1335.    End If 
  1336. End Proc
  1337. Procedure _SETNOFRAMES
  1338.    SCR=Screen
  1339.    Screen Open 4,640,64,2,Hires
  1340.    Curs Off : Cls 0 : Palette $8,$FF0 : Flash Off 
  1341.    Paper 0 : Pen 1
  1342.    Locate 1,1 : Print "Set number of frames"
  1343.    Locate 1,3 : Print Using "Current number of frames : ###";_NOFRAMES
  1344.    Locate 1,5 : Print "(press return to cancel)"
  1345.    Locate 1,4 : Input "Please enter the new number of frames :";NF
  1346.  
  1347.    If NF<_NOFRAMES and NF<>0
  1348.       Locate 1,6 : Print Using "This will delete the last ### frames of your animation.";_NOFRAMES-NF
  1349.       Locate 1,7 : Print "Are you sure you wish to do this? (Y/N)"
  1350.       Repeat 
  1351.          I$=Upper$(Inkey$)
  1352.       Until I$="Y" or I$="N" or I$=Chr$(27)
  1353.       If I$="Y"
  1354.          _NOFRAMES=NF
  1355.          If _FRAME>_NOFRAMES
  1356.             _FRAME=_NOFRAMES
  1357.          End If 
  1358.       End If 
  1359.    Else If NF<>0
  1360.       Cls 0
  1361.       Locate 1,1 : Print "Please wait while I add the new frames..."
  1362.       For F=_NOFRAMES To NF-1
  1363.          For O=0 To _NOBJ-1
  1364.             For I=0 To 2
  1365.                _POS(F,O,I)=_POS(_NOFRAMES-1,O,I)
  1366.                _ANG(F,O,I)=_ANG(_NOFRAMES-1,O,I)
  1367.             Next 
  1368.          Next 
  1369.       Next 
  1370.       _NOFRAMES=NF
  1371.    End If 
  1372.    Screen Close 4
  1373.    Screen SCR
  1374.    _MAKEFRAME
  1375. End Proc
  1376. Procedure _GOTOFRAME
  1377.    SCR=Screen
  1378.    Screen Open 4,640,64,2,Hires
  1379.    Curs Off : Cls 0 : Palette $8,$FF0 : Flash Off 
  1380.    Paper 0 : Pen 1
  1381.    Locate 1,1 : Input "Goto frame number :";N
  1382.    If N>_NOFRAMES or N<1
  1383.       Locate 1,3 : Print "Frame does not exist"
  1384.       Wait 50
  1385.    Else 
  1386.       _FRAME=N-1
  1387.    End If 
  1388.    Screen Close 4
  1389.    Screen SCR
  1390.    _MAKEFRAME
  1391.    _REDRAW
  1392. End Proc
  1393. Procedure _ANIMATE
  1394.    _REDRAW
  1395.    Set Paint 1 : Ink 0,0,1
  1396.    _OF=_FRAME
  1397.    _FRAME=0
  1398. '   _OXR=_XROT : _OYR=YROT 
  1399. '   XS=_YROT-X Screen(X Mouse) 
  1400. '   YS=_XROT-Y Screen(Y Mouse) 
  1401.    Repeat 
  1402. '      _YROT=XS+X Screen(X Mouse)
  1403. '      _XROT=YS+Y Screen(Y Mouse)
  1404.       _ROTATED=False
  1405.       Wait Vbl 
  1406.       _DRAWPERSP[-1]
  1407.       Screen Swap 
  1408.       Add _FRAME,1,0 To _NOFRAMES-1
  1409.    Until Inkey$<>"" or Mouse Key<>0
  1410. '   _XROT=_OXR : _YROT=_OYR
  1411.    Clear Key 
  1412.    _FRAME=_OF
  1413.    _REDRAW
  1414. End Proc
  1415. Procedure _MAKESUB
  1416.    X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
  1417.    _SELPOINT[X,Y] : P=Param
  1418.    _PARENT=_PTASSOC(P)
  1419.    If _PARENT=_SELOBJ
  1420.       _WARN
  1421.    Else 
  1422.       _SUBOBJ(_PARENT,_NOSUBOBJ(_PARENT),0)=_SELOBJ
  1423.       _SUBOBJ(_PARENT,_NOSUBOBJ(_PARENT),1)=P
  1424.       Inc _NOSUBOBJ(_PARENT)
  1425.       _IMASUB(_SELOBJ)=True
  1426.       _MOVESUB[_PARENT]
  1427.       _REDRAW
  1428.    End If 
  1429. End Proc
  1430. Procedure _SELPOINT[X,Y]
  1431.    If Not _ROTATED
  1432.       _ROTPOINTS[-1]
  1433.    End If 
  1434.    Def Fn DIST(X1,Y1,X2,Y2)=Sqr((X2-X1)^2+(Y2-Y1)^2)
  1435.    Z=Zone(X,Y)
  1436.    _GETCOORDS[X,Y]
  1437.    If Z=1
  1438.       'overhead view (ignore y)
  1439.       D= Fn DIST(XRET,ZRET,_PVRPT(0,0),_PVRPT(0,2))
  1440.       P=0
  1441.       For PP=1 To _NPTS-1
  1442.          DD= Fn DIST(XRET,ZRET,_PVRPT(PP,0),_PVRPT(PP,2))
  1443.          If DD<D
  1444.             D=DD : P=PP
  1445.          End If 
  1446.       Next 
  1447.    Else If Z=2
  1448.       'front view (ignore z) 
  1449.       D= Fn DIST(XRET,YRET,_PVRPT(0,0),_PVRPT(0,1))
  1450.       P=0
  1451.       For PP=1 To _NPTS-1
  1452.          DD= Fn DIST(XRET,YRET,_PVRPT(PP,0),_PVRPT(PP,1))
  1453.          If DD<D
  1454.             D=DD : P=PP
  1455.          End If 
  1456.       Next 
  1457.    Else If Z=3
  1458.       'side view (ignore x)
  1459.       D= Fn DIST(ZRET,YRET,_PVRPT(0,2),_PVRPT(0,1))
  1460.       P=0
  1461.       For PP=1 To _NPTS-1
  1462.          DD= Fn DIST(ZRET,YRET,_PVRPT(PP,2),_PVRPT(PP,1))
  1463.          If DD<D
  1464.             D=DD : P=PP
  1465.          End If 
  1466.       Next 
  1467.    Else If Z=4
  1468.       '3D view 
  1469.       If Not _ROTATED
  1470.          _ROTPOINTS[-1]
  1471.       End If 
  1472.       D= Fn DIST(X,Y,_XP(0),_YP(0))
  1473.       P=0
  1474.       For PP=1 To _NPTS-1
  1475.          DD= Fn DIST(X,Y,_XP(PP),_YP(PP))
  1476.          If DD<D
  1477.             D=DD : P=PP
  1478.          End If 
  1479.       Next 
  1480.    End If 
  1481. End Proc[P]
  1482. Procedure _MOVESUB[S]
  1483.    If Not _ROTATED
  1484.       _ROTPOINTS[-1]
  1485.    End If 
  1486.    If S<0
  1487.       For O=0 To _NOBJ-1
  1488.          If Not _IMASUB(O)
  1489.             _MOVESUB[O]
  1490.          End If 
  1491.       Next 
  1492.    Else 
  1493.       If _NOSUBOBJ(S)>0
  1494.          For O=0 To _NOSUBOBJ(S)-1
  1495.             OO=_SUBOBJ(S,O,0)
  1496.             P=_SUBOBJ(S,O,1)
  1497.             _POS(_FRAME,OO,0)=_PVRPT(P,0)
  1498.             _POS(_FRAME,OO,1)=_PVRPT(P,1)
  1499.             _POS(_FRAME,OO,2)=_PVRPT(P,2)
  1500.             _ROTPOINTS[OO]
  1501.             _MOVESUB[OO]
  1502.          Next 
  1503.       End If 
  1504.    End If 
  1505. End Proc
  1506. Procedure _HIGHSUB[O,C]
  1507.    'draw object and all sub objects of O
  1508.    _HIGHOBJ[O,C]
  1509.    If _NOSUBOBJ(O)>0
  1510.       For N=0 To _NOSUBOBJ(O)-1
  1511.          _HIGHOBJ[_SUBOBJ(O,N,0),C]
  1512.          _HIGHSUB[_SUBOBJ(O,N,0),C]
  1513.       Next 
  1514.    End If 
  1515. End Proc
  1516. Procedure _ROTPOINTVIEW
  1517.    _REDRAW
  1518.    XS=_YROT-X Screen(X Mouse)
  1519.    YS=_XROT-Y Screen(Y Mouse)
  1520.    Set Paint 1 : Ink 0,0,1
  1521.    Repeat 
  1522.       _YROT=XS+X Screen(X Mouse)
  1523.       _XROT=YS+Y Screen(Y Mouse)
  1524.       Screen 2
  1525.       _MAKESTRING[_XROT] : _MAKENUM[Param$] : Get Bob 11,0,0 To 16,6
  1526.       _MAKESTRING[_YROT] : _MAKENUM[Param$] : Get Bob 12,0,0 To 16,6
  1527.       Screen 0
  1528.       _ROTATED=False
  1529.       _DRAWPOINTPERSP
  1530.       Wait Vbl 
  1531.       Screen Swap 
  1532.       Sprite Off 10
  1533.       Sprite Off 11
  1534.       Sprite 10,_CXP,_CYP+6,12
  1535.       Sprite 11,_CXP,_CYP+12,11
  1536.    Until Mouse Key=0
  1537.    Set Paint 0
  1538. End Proc
  1539. Procedure _DRAWPOINTPERSP
  1540.    If Not _ROTATED
  1541.       _ROTPOINTS[-1]
  1542.    End If 
  1543.    Clip 161,1 To 318,127
  1544.    Cls 0,161,1 To 318,127
  1545.    If _NOBJ>0
  1546.       Ink 6
  1547.       For O=0 To _NOBJ-1
  1548.          For P=0 To _NOP(O)
  1549.             PT1=_PGN(O,P,0)
  1550.             For S=1 To _NOS(O,P)+1
  1551.                PT2=_PGN(O,P,S)
  1552.                Draw _XP(PT1),_YP(PT1) To _XP(PT2),_YP(PT2)
  1553.                PT1=PT2
  1554.             Next 
  1555.          Next 
  1556.       Next 
  1557.       Ink 1
  1558.       For P=0 To _NPTS-1
  1559.          Box _XP(P)-1,_YP(P)-1 To _XP(P)+1,_YP(P)+1
  1560.       Next 
  1561.    End If 
  1562.    Clip 
  1563. End Proc
  1564. Procedure _DISCONNECT
  1565.    If _SELOBJ>0
  1566.       If _IMASUB(_SELOBJ)
  1567.          'first find this objects parent
  1568.          Screen Open 4,640,64,2,Hires : Curs Off : Cls 0 : Paper 0 : Pen 1
  1569.          Palette $8,$FF0 : Screen Display 4,,Y Hard(0,-80),,
  1570.          Locate 0,3 : Centre "Object Disconnected"
  1571.          For O=0 To _NOBJ-1
  1572.             If _NOSUBOBJ(O)>0
  1573.                For S=0 To _NOSUBOBJ(O)-1
  1574.                   If _SELOBJ=_SUBOBJ(O,S,0)
  1575.                      _PARENT=O
  1576.                      _SUB=S
  1577.                   End If 
  1578.                Next 
  1579.             End If 
  1580.          Next 
  1581.          Dec _NOSUBOBJ(_PARENT)
  1582.          Swap _SUBOBJ(_PARENT,_SUB,0),_SUBOBJ(_PARENT,_NOSUBOBJ(_PARENT),0)
  1583.          Swap _SUBOBJ(_PARENT,_SUB,1),_SUBOBJ(_PARENT,_NOSUBOBJ(_PARENT),1)
  1584.          _IMASUB(_SELOBJ)=False
  1585.          For P=-80 To 300 Step 4
  1586.             Wait Vbl 
  1587.             Screen Display 4,,Y Hard(0,P),,
  1588.          Next 
  1589.       Else 
  1590.          _WARN
  1591.       End If 
  1592.    Else 
  1593.       _WARN
  1594.    End If 
  1595. End Proc
  1596. Procedure _WARN
  1597.    Bell 20
  1598.    Wait 5
  1599.    Play Off 
  1600. End Proc
  1601. Procedure _COPY
  1602.    SCR=Screen
  1603.    Screen Open 4,640,64,2,Hires
  1604.    Curs Off : Cls 0 : Palette $8,$FF0 : Flash Off 
  1605.    Paper 0 : Pen 1
  1606.    Locate 1,1 : Print "Copy current frame to which frame?"
  1607.    Locate 1,2 : Print Using "(current frame    : ###)";_FRAME+1
  1608.    Locate 1,3 : Print Using "(number of frames : ###)";_NOFRAMES
  1609.    Locate 1,4 : Print "(press return to cancel)"
  1610.    Locate 1,6 : Input ":";F
  1611.    Curs Off 
  1612.    Locate 1,6 : Cline 
  1613.    If(F>0) and(F<=_NOFRAMES)
  1614.       Dec F
  1615.       For O=0 To _NOBJ-1
  1616.          For I=0 To 2
  1617.             _POS(F,O,I)=_POS(_FRAME,O,I)
  1618.             _ANG(F,O,I)=_ANG(_FRAME,O,I)
  1619.          Next 
  1620.       Next 
  1621.       Print "Frame copied"
  1622.    Else 
  1623.       Print "Not done"
  1624.    End If 
  1625.    Wait 50
  1626.    Screen Close 4
  1627.    Screen SCR
  1628. End Proc
  1629. Procedure _UPDATE
  1630.    _ROTATED=False
  1631.    For O=0 To _MAXNOBJ
  1632.       _IMASUB(O)=False
  1633.    Next 
  1634.    For O=0 To _NOBJ-1
  1635.       If _NOSUBOBJ(O)>0
  1636.          For S=0 To _NOSUBOBJ(O)-1
  1637.             _IMASUB(_SUBOBJ(O,S,0))=True
  1638.          Next 
  1639.       End If 
  1640.    Next 
  1641.    _MOVESUB[-1]
  1642.    _REDRAW
  1643. End Proc
  1644. Procedure _WRITEINCBIN
  1645.    SCR=Screen
  1646.    Screen Open 4,640,64,2,Hires
  1647.    Curs Off : Cls 0 : Palette $8,$FF0 : Paper 0 : Pen 1
  1648.    Locate 1,1 : Print "Write Data File"
  1649.    Locate 1,3 : Input "Filename:";F$
  1650.    Curs Off 
  1651.    If Exist(F$)
  1652.       Locate 1,5 : Print "File already exists.  Overwrite? (Y/N)"
  1653.       Repeat 
  1654.          I$=Upper$(Inkey$)
  1655.       Until I$="Y" or I$="N"
  1656.       If I$="N"
  1657.          Goto SKIPWRITE
  1658.       End If 
  1659.    End If 
  1660.    Reserve As Work 10,64000
  1661.    A=Start(10)
  1662.    _POINTREMOVAL
  1663.    If Not _ROTATED : _ROTPOINTS[-1] : End If 
  1664.    Doke A,_NPTS : Add A,2
  1665.    Doke A,_NOFRAMES : Add A,2
  1666.    C=A
  1667.    Add A,2*_NOFRAMES : Rem pointers to point data for each frame
  1668.    B=A
  1669.    Locate 1,6 : Cline : Print "Storing object pointers"
  1670.    For N=0 To _NOBJ-1
  1671.       Add A,2 : Rem pointer to object description  
  1672.       Doke A,_MIDPT(N)*10 : Add A,2 : Rem sort point 
  1673.    Next 
  1674.    Doke A,-1 : Add A,2 : Rem terminate table in -1
  1675.    For O=0 To _NOBJ-1
  1676.       Locate 1,6 : Cline : Print "Storing object ";O
  1677.       Doke B,A-Start(10) : Add B,4 : Rem pointer to object
  1678.       For P=0 To _NOP(O)-1
  1679.          Doke A,_NOS(O,P) : Add A,2
  1680.          Doke A,0 : Add A,2
  1681.          For S=0 To _NOS(O,P)+1
  1682.             Doke A,_PGN(O,P,S) : Add A,2
  1683.             Poke A,_TEXPOS(O,P,S,0) : Add A,1
  1684.             Poke A,_TEXPOS(O,P,S,1) : Add A,1
  1685.          Next 
  1686.          Doke A,_POLYTEX(O,P) : Add A,2
  1687.          _P1=_PGN(O,P,0) : _P2=_PGN(O,P,1) : _P3=_PGN(O,P,2)
  1688.          _P=_PVRPT(_P1,0) : _Q=_PVRPT(_P1,1) : _R=_PVRPT(_P1,2)
  1689.          _U=_PVRPT(_P2,0) : _V=_PVRPT(_P2,1) : _W=_PVRPT(_P2,2)
  1690.          _X=_PVRPT(_P3,0) : _Y=_PVRPT(_P3,1) : _Z=_PVRPT(_P3,2)
  1691.          _ASQR=(_X-_P)^2+(_Y-_Q)^2+(_Z-_R)^2
  1692.          _BSQR=(_X-_U)^2+(_Y-_V)^2+(_Z-_W)^2
  1693.          _LSQR=(_P-_U)^2+(_Q-_V)^2+(_R-_W)^2
  1694.          _DSQR=_ASQR-((_LSQR+_ASQR-_BSQR)^2)/(4*_LSQR)
  1695.          _D=Sqr(_DSQR)*Sqr(_LSQR)
  1696.          Doke A,_D : Add A,2 : Rem dist of pt from line in 3D 
  1697.          Doke A,0 : Add A,2 : Rem 0,1 - Geraude shading
  1698.       Next 
  1699.       Doke A,-1 : Add A,2 : Rem terminate object in -1 
  1700.    Next 
  1701.    _OF=_FRAME
  1702.    For _FRAME=0 To _NOFRAMES-1
  1703.       Locate 1,6 : Cline : Print Using "Frame ### : ";_FRAME+1;"rotating"
  1704.       Doke C,A-Start(10) : Add C,2
  1705.       _ROTPOINTS[-1]
  1706.       Locate 1,6 : Cline : Print Using "Frame ### : ";_FRAME+1;"storing"
  1707.       For N=0 To _NPTS-1
  1708.          Doke A,_PVRPT(N,0) : Add A,2
  1709.          Doke A,-_PVRPT(N,1) : Add A,2
  1710.          Doke A,_PVRPT(N,2) : Add A,2
  1711.       Next 
  1712.    Next 
  1713.    Locate 1,6 : Cline : Print "Saving data..."
  1714.    Bsave F$,Start(10) To A
  1715.    _FRAME=_OF
  1716.    _ROTPOINTS[-1]
  1717.    Erase 10
  1718.    Screen 0
  1719.    _OPENPROJ[_PROJ$]
  1720.    Locate 1,6 : Cline : Print "All done..."
  1721.    Wait 50
  1722. SKIPWRITE:
  1723.    Screen Close 4
  1724.    Screen SCR
  1725. End Proc
  1726. Procedure _CHANGESIZE
  1727.    SCR=Screen
  1728.    Screen Open 4,640,64,2,Hires
  1729.    Curs Off : Cls 0 : Palette $8,$FF0 : Flash Off 
  1730.    Paper 0 : Pen 1
  1731.    Locate 1,1 : Print "Change size"
  1732.    Locate 1,3 : Print Using "Size is currently at ####%";_SIZE;" of saved objects size."
  1733.    Locate 1,4 : Input "New size : ";NS$
  1734.    NS=Val(NS$)
  1735.    Screen Close 4
  1736.    Screen SCR
  1737.    If NS>0
  1738.       _SIZE=NS
  1739.       _OPENPROJ[_PROJ$]
  1740.    End If 
  1741.    _UPDATE
  1742. End Proc
  1743. Procedure _INITALL
  1744.    _SELOBJ=-1
  1745.    _ROTATED=False
  1746.    If _NPTS>0
  1747.       For P=0 To _NPTS-1
  1748.          _PT(P,0)=0
  1749.          _PT(P,0)=1
  1750.          _PT(P,0)=2
  1751.          _PTASSOC(P)=-1
  1752.       Next 
  1753.       _NPTS=0
  1754.    End If 
  1755.    _FRAME=0
  1756.    If _NOBJ>0
  1757.       For O=0 To _NOBJ-1
  1758.          For PG=0 To _MAXPGNS
  1759.             For S=0 To _MAXNOS
  1760.                _PGN(O,PG,S)=0
  1761.                _TEXPOS(O,PG,S,0)=0
  1762.                _TEXPOS(O,PG,S,1)=0
  1763.             Next 
  1764.             _NOS(O,PG)=0
  1765.             _POLYTEX(O,PG)=0
  1766.          Next 
  1767.          _NOP(O)=0
  1768.          _MIDPT(O)=-1
  1769.          _NOSUBOBJ(O)=0
  1770.          _IMASUB(O)=False
  1771.          For F=0 To _MAXFRAMES
  1772.             For D=0 To 2
  1773.                _ANG(F,O,D)=0
  1774.                _POS(F,O,D)=0
  1775.             Next 
  1776.          Next 
  1777.          For S=0 To _MAXNOSUBOBJ
  1778.             _SUBOBJ(O,S,0)=0
  1779.             _SUBOBJ(O,S,1)=0
  1780.          Next 
  1781.       Next 
  1782.       _NOBJ=0
  1783.    End If 
  1784. End Proc
  1785. Procedure _POINTREMOVAL
  1786.    'note that this procedure only checks for points that are
  1787.    'in the same place in the current frame.  These points are 
  1788.    'removed, i.e. object pointers are swapped around and then 
  1789.    'the points themseleves are moved about until the unused 
  1790.    'points are all at the end, these points can then be ignored.
  1791.    'NOTE: it is a VERY good idea to reload the project after
  1792.    'the reorganised points have been used.
  1793.    Dim PISP(_NPTS-1)
  1794.    For P=0 To _NPTS-1
  1795.       PISP(P)=-1
  1796.    Next 
  1797.    If Not _ROTATED
  1798.       _ROTPOINTS[-1]
  1799.    End If 
  1800.    Print Using " Scanning for points in the same place (out of ###)";_NPTS
  1801.    NPISP=0
  1802.    For P=0 To _NPTS-2
  1803.       _X=_PVRPT(P,0)
  1804.       _Y=_PVRPT(P,1)
  1805.       _Z=_PVRPT(P,2)
  1806.       For Q=P+1 To _NPTS-1
  1807.          If PISP(Q)<0
  1808.             If(_PVRPT(Q,0)=_X) and(_PVRPT(Q,1)=_Y) and(_PVRPT(Q,2)=_Z)
  1809.                PISP(Q)=P
  1810.                Inc NPISP
  1811.             End If 
  1812.          End If 
  1813.       Next 
  1814.    Next 
  1815.    Print Using " Found ### points in the same place.";NPISP
  1816.    Print " Reorganising pointers to points..."
  1817.    For P=0 To _NPTS-1
  1818.       If PISP(P)>=0
  1819.          _OBJ=_PTASSOC(P)
  1820.          For F=0 To _NOP(_OBJ)
  1821.             For S=0 To _NOS(_OBJ,F)+1
  1822.                If _PGN(_OBJ,F,S)=P
  1823.                   _PGN(_OBJ,F,S)=PISP(P)
  1824.                End If 
  1825.             Next 
  1826.          Next 
  1827.          _PTASSOC(P)=-1
  1828.       End If 
  1829.    Next 
  1830.    Print " Pointers reorganised, reshuffling..."
  1831.    P=0
  1832.    Repeat 
  1833.       If _PTASSOC(P)=-1
  1834.          _DELETEPOINT[P]
  1835.       Else 
  1836.          Inc P
  1837.       End If 
  1838.    Until P>=_NPTS
  1839.    Print 
  1840. End Proc
  1841. Procedure _DELETEPOINT[P]
  1842.    For N=P To _NPTS-2
  1843.       _PT(N,0)=_PT(N+1,0)
  1844.       _PT(N,1)=_PT(N+1,1)
  1845.       _PT(N,2)=_PT(N+1,2)
  1846.       _PTASSOC(N)=_PTASSOC(N+1)
  1847.    Next 
  1848.    For O=0 To _NOBJ-1
  1849.       If _MIDPT(O)>P
  1850.          Dec _MIDPT(O)
  1851.       End If 
  1852.       For F=0 To _NOP(O)
  1853.          For S=0 To _NOS(O,F)+1
  1854.             If _PGN(O,F,S)>P
  1855.                Dec _PGN(O,F,S)
  1856.             Else If _PGN(O,F,S)=P
  1857.                Bell 
  1858.             End If 
  1859.          Next 
  1860.       Next 
  1861.    Next 
  1862.    _ROTATED=False
  1863.    Dec _NPTS
  1864. End Proc